:- expects_dialect(lps). end_of_file. % @TODO unbreak % consolidated loan example. :- include(system('date_utils.pl')). simulatedRealTimeBeginning('2014-05-31'). % The date of the initial state at cycle 1. simulatedRealTimePerCycle(21600). % Each cycle = 21600 seconds = 1/4th of a day. maxTime(3200). % 3200 cycles = 800 days. events request/2, advance/2. fluents requested/3, advanced/2, legal_action_against/1, terminated. request(Borrower, Amount) initiates requested(Borrower, Amount, Date) if real_date(Date). advance(Lender, Amount) initiates advanced(Lender, Amount). end_of_day(2014/6/1) initiates terminated if not requested(borrower, 1000, 2014/6/1). end_of_day(2014/6/2) initiates legal_action_against(lender) if requested(borrower, 1000, 2014/6/1), not advanced(lender, 1000). events pay/3. fluents paid/4, potential_defaulted/1. due(550, 2015/6/1). due(525, 2016/6/1). end_of_day(Date) initiates potential_defaulted(pay(borrower, lender, Amount)) if due(Amount, Date), not paid(borrower, lender, Amount, Date). false pay(borrower, lender, Amount), due(Amount, Date2), real_date(Date1), Date1 @< Date2. pay(Borrower, Lender, Amount) initiates paid(Borrower, Lender, Amount, Date) if real_date(Date). events notify/2. fluents defaulted/2, notified/3, remedied/1, cured/1. % shouldn't be necessary. notify(Person, Message) initiates notified(Person, Message, Date) if real_date(Date). /* end_of_day(Date2) initiates defaulted(Requirement, Date2) if potential_defaulted( Requirement), notified(lender, default(Requirement), Date1), real_date_add(Date1, 2, Date2), not defaulted(_, _), % In the event of multiple events of default, % the first to occur shall take precedence % for the purposes of specifying outcomes under this agreement. not cured(Requirement). */ end_of_day(Date2) initiates defaulted(Requirement, Date3) % Date2??? if potential_defaulted( Requirement), notified(lender, default(Requirement), Date1), real_date_add(Date1, 2, Date2), real_date_add(Date1, 3, Date3), not defaulted(_, _), % In the event of multiple events of default, % the first to occur shall take precedence % for the purposes of specifying outcomes under this agreement. not cured(Requirement). cured(Requirement) at T if remedied(Requirement) at T, notified(borrower, remedy(Requirement), _) at T. pay(borrower, lender, Amount) initiates remedied(pay(borrower, lender, Amount)) if potential_defaulted(pay(borrower, lender, Amount)). events file/2. file(borrower, bankruptcy) initiates potential_defaulted(bankruptcy_insolvency(borrower)). file(borrower, insolvency) initiates potential_defaulted(bankruptcy_insolvency(borrower)). events remedy/1. remedy(Violation) initiates remedied(Violation). events prove_untrue/1. prove_untrue(Requirement) initiates potential_defaulted(Requirement) if represents_warrants(borrower, Requirement). represents_warrants(borrower, `borrower's assets exceed liabilities at time T if borrower executes contract at time T or borrower requests funds at time T or due(Amount, Date) and T is on or before Date`). events fails_to_perform/2. fails_to_perform(borrower, Requirement) initiates potential_defaulted(Requirement) if covenant(borrower, Requirement). covenant(borrower, `pay borrower tax at time T if tax due at time T and borrower executes contract at time T or borrower requests funds at time T or due(Amount, Date) and T is on or before Date`). total_due(1075) at T if not paid(borrower, lender, 550,_) at T. total_due(525) at T if paid(borrower, lender, 550,_), not paid(borrower, lender, 525,_) at T. end_of_day(Date) initiates legal_action_against(borrower) if defaulted(_, Date), Date @< 2020/06/01, % within NY State Statute of Limitation. total_due(Sum), not paid(borrower, lender, Sum, Date). pay(borrower, lender, Sum) initiates terminated if defaulted(_, Date), real_date(Date), total_due(Sum). pay(borrower, lender, 525) initiates terminated if not defaulted(_, _), paid(borrower, lender, 550,_). /* end_of_day(Date) initiates terminated if defaulted(_, Date), % Date @< 2020/06/01, % within NY State Statute of Limitation. not needed? total_due(Sum), paid(borrower, lender, Sum, Date). pay(borrower, lender, 525) initiates terminated if not defaulted(_, _), paid(borrower, lender, 550,_). pay(borrower, lender, Sum) initiates terminated if not legal_action_against(borrower), total_due(Sum). pay(borrower, lender, 525) initiates terminated if not legal_action_against(borrower), paid(borrower, lender, 550,_). */ observe request(borrower, 1000) at '2014-06-01T15:00'. % at 15:00. observe advance(lender, 1000) at '2014-06-02T18:00'. observe pay(borrower,lender, 550) at '2015-06-01T12:00'. observe pay(borrower,lender, 525) at '2016-06-04T06:00'. % change date: earlier or later. observe notify(lender, default(pay(borrower, lender, 525))) at '2016-06-02'.